/**
 *    Copyright 2012 Geensoft S.A.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 **/
package ar.com.greensoft.neosystem.dao.jpa;

import java.util.HashMap;
import java.util.Map;

import javax.ejb.Stateless;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Selection;

import ar.com.greensoft.neosystem.dao.InternacionDao;
import ar.com.greensoft.neosystem.dto.InternacionDto;
import ar.com.greensoft.neosystem.model.internacion.Internacion;
import ar.com.greensoft.neosystem.model.internacion.Internacion_;
import ar.com.greensoft.neosystem.search.SearchFilter;
import ar.com.greensoft.neosystem.search.internacion.InternacionSearchFilter;

/**
 * 
 * @author Jorge E. Villaverde
 * @since 23/11/2012
 * @version 1.0.0
 */
@Stateless
public class JpaInternacionDaoImpl 
	extends AbstractLongIdJpaDaoDtoImpl<Internacion, InternacionDto> 
	implements InternacionDao {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	protected Class<Internacion> getEntityClazz() {
		return Internacion.class;
	}

	@Override
	protected Expression<Boolean> createWhereFromSearchFilter(
			SearchFilter searchFilter, Root<Internacion> root) {
		
		InternacionSearchFilter filter = (InternacionSearchFilter)searchFilter;
		CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
		Predicate predicate = null;
		
		if(filter.getEstado() != null){
			Predicate predEstado = criteriaBuilder.equal(
					root.get(Internacion_.estado), filter.getEstado());
			predicate = appendAndPredicate(predicate, predEstado);						
		}
		
		if(filter.getFecha() != null){
			Predicate predFecha = criteriaBuilder.equal(
					root.get(Internacion_.fecha), filter.getFecha());
			predicate = appendAndPredicate(predicate, predFecha);
		}
		
		return predicate;
	}

	@Override
	protected String getFindByNameNamedQuery() {
		return null;
	}

	@Override
	protected Class<InternacionDto> getDtoClazz() {
		return InternacionDto.class;
	}

	@Override
	protected Selection<? extends InternacionDto> createDtoBuilder(CriteriaBuilder builder, Root<Internacion> root) {
		return builder.construct(InternacionDto.class,
				root.get(Internacion_.id),				
				root.get(Internacion_.fecha),
				root.get(Internacion_.fechaAlta),
				root.get(Internacion_.fechaDerivacion),
				root.get(Internacion_.fechaDeceso),
				root.get(Internacion_.fechaNacimiento),
				root.get(Internacion_.motivoInternacion),
				root.get(Internacion_.estado),
				root.get(Internacion_.motivo));
	}

	@Override
	protected Map<String, Expression<?>> getExpressionMap(Root<Internacion> root) {
		if(expressionMap == null){
			expressionMap = new HashMap<String, Expression<?>>();
			expressionMap.put("fecha", root.get(Internacion_.fecha));
			expressionMap.put("fechaAlta", root.get(Internacion_.fechaAlta));
			expressionMap.put("fechaDerivacion", root.get(Internacion_.fechaDerivacion));
			expressionMap.put("fechaDeceso", root.get(Internacion_.fechaDeceso));
			expressionMap.put("fechaNacimiento", root.get(Internacion_.fechaNacimiento));
			expressionMap.put("madre", root.get(Internacion_.madre));
			expressionMap.put("motivoInternacion", root.get(Internacion_.motivoInternacion));
			expressionMap.put("estado", root.get(Internacion_.estado));
			expressionMap.put("motivo", root.get(Internacion_.motivo));
		}
		return expressionMap;
	}
}
